

def run():
    print(f"执行 run() 方法")


# 异常处理
try:
    run()
except Exception as e:
    # 发生异常执行
    print(f"发生异常执行 - ", e)
else:
    # 不发生异常执行
    try:
        with open('file.log') as file:
            read_data = file.read()
    except FileNotFoundError as fnf_error:
        print(f"发生异常 - ", fnf_error)
finally:
    # 无论是否发生异常都执行
    print(f'这句话，无论是否发生异常都执行。')


# 抛出异常
# Python 使用 raise 语句抛出一个指定的异常。
#
# raise语法格式如下：
#
# raise [Exception [, args [, traceback]]]
# x = 10
# if x > 5:
#     raise Exception('x 不能大于 5。x 的值为: {}'.format(x))

# 如果想抛出一个异常，并不想处理，就直接抛出就可以了
# try:
#     raise NameError('HiThere')
# except NameError:
#     print('An exception flew by!')
#     raise


# 自定义异常
# class MyError(Exception):
#     def __init__(self, value):
#         self.value = value
#
#     def __str__(self, value):
#         # repr() 函数将对象转化为供解释器读取的形式。
#         return repr(self.value)
#
#
# try:
#     raise MyError(2 * 2)
# except MyError as e:
#     print('My exception occurred, value:', e.value)


# 定义清理行为
# try 语句还有另外一个可选的子句，它定义了无论在任何情况下都会执行的清理行为。
def divide(x, y):
    try:
        result = x / y
    except ZeroDivisionError:
        print("division by zero!")
    else:
        print("result is", result)
    finally:
        print("executing finally clause")


divide(1, 0)


# 预定义清理行为
# 就算在处理过程中出问题了，文件 f 总是会关闭
with open("myfile.txt") as f:
    for line in f:
        print(line, end="")




